/**
 * 模仿49
 * @param {*} s 
 * @param {*} p 
 * @returns 
 */
// var findAnagrams = function(s, p) {
//     let n=s.length,
//         m=p.length,
//         ans=[];
//     if(n<m) return []
//     let r=p.split('').map(c=>c.charCodeAt()).sort().join()
//     for(let i=0;i<n;i++){
//         let str = s.slice(i,i+m)
//         let strO = str.split('').map(c=>c.charCodeAt()).sort().join()
//         ans.push(strO)
//     }
//     console.log(ans,r);
//     let q=ans.length
//     let res=[]
//     for(let i=0;i<q;i++){
//         if(ans[i]==r){
//             res.push(i)
//         }
//     }
//     return res
// };
// //console.log(findAnagrams( "abab","ab"));

/**
 * 升级
 */

var findAnagrams = function(s, p) {
    let n=s.length,
        m=p.length,
        j=0;
    let res=[],
        ans=new Map();
    if(n<m) return []
    let r=p.split('').sort().join()
    for(let i=0;i<m;i++){
        if(!ans.has(p[i])){
            ans.set(p[i],0)
            j++;
            if(j>=26) break;
        }
    }
    //console.log(ans);
    for(let i=0;i<n;i++){
        if(i+m>n) return res
        if(!ans.has(s[i])) continue
        let str = s.slice(i,i+m).split('').sort().join()
        if(str==r) res.push(i)
    }
    return res
};
// console.log(findAnagrams("cbaebabacd","abc"));

/***
 * letcode 官方
 */
var findAnagrams = function(s, p) {
    const sLen = s.length, pLen = p.length;

    if (sLen < pLen) {
        return [];
    }

    const ans = [];
    const sCount = new Array(26).fill(0);
    const pCount = new Array(26).fill(0);
    for (let i = 0; i < pLen; ++i) {
        ++sCount[s[i].charCodeAt() - 'a'.charCodeAt()];
        ++pCount[p[i].charCodeAt() - 'a'.charCodeAt()];
    }

    if (sCount.toString() === pCount.toString()) {
        ans.push(0);
    }

    for (let i = 0; i < sLen - pLen; ++i) {
        --sCount[s[i].charCodeAt() - 'a'.charCodeAt()];
        ++sCount[s[i + pLen].charCodeAt() - 'a'.charCodeAt()];

        if (sCount.toString() === pCount.toString()) {
            ans.push(i + 1);
        }
    }

    return ans;
};